package cn.tedu.micro.demo.rabbitmq;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

@SpringBootTest
@Slf4j
public class MyProduct {
    private Channel channel;
    @Before
    public void createChannel() {
        try {
//            1.创建连接工厂-工厂模式 创建连接的过程
            ConnectionFactory connectionFactory = new ConnectionFactory();
//            2.给工厂提供连接属性ip地址、端口号、用户名、密码
            connectionFactory.setHost("192.168.8.100");
            connectionFactory.setPort(5672);
            connectionFactory.setUsername("admin");
            connectionFactory.setPassword("123456");
//            3.新建一个连接
            Connection connection = connectionFactory.newConnection();
//            4.创建通道短连接
            channel = connection.createChannel();
        } catch (Exception e) {
            log.error("创建通道失败");
        }
    }
    @Test
    public void queueDeclare()  {
        try {
            /**
             *String queue: 创建的队列名称,在虚拟主机中 只能存在唯一名称
             *Boolean durable: 队列是否持久化 true在rabbitmq重启之后 队列保持存在 false不存在
             *Boolean exclusive: 队列是绑定当前连接对象(独占 专属) true别的链接无法操作队列 false所有连接都可以操作队列
             *Boolean autoDelete: 队列是否自动删除 true队列从第一个监听消费者开始计算,到最后一个消费者断开连接,自动删除 false不删除
             *Map<String,Object> args: 队列特性参数 value三种 string (long double integer) boolean
             *key值是固定的,可以表示rabbitmq声明队列的特性,比如队列最大长度(最多可以容纳多少个消息)
             */
            channel.queueDeclare("queue1", false, false, false, null);
        } catch (IOException e) {
            log.error("创建队列失败");
        }
    }
    @Test
    public void sendMessage() {
    try {
//        准备消息
        String message = "hello rabbitmq";
//        序列化
        byte[] bytes = message.getBytes();
//        调用channel的api发送消息
        channel.basicPublish("biz_ex", "", null, bytes);
    }catch (Exception e){
        log.error("发送消息失败");
    }
    }
}
